import * as THREE from 'three';

export class TextureManager {
  private static instance: TextureManager;
  private textures: Map<string, THREE.Texture> = new Map();

  private constructor() {
  }

  public static getInstance(): TextureManager {
    if (!TextureManager.instance) {
      TextureManager.instance = new TextureManager();
    }
    return TextureManager.instance;
  }

  public async loadTextures(): Promise<void> {
    const textureNames = [
      'grass_top', 'grass_side', 'dirt', 'stone',
      'log_top', 'log_side', 'planks', 'coal_ore',
      'lava', 'furnace_top', 'furnace_front', 'furnace_side',
      'torch', 'crafting_table_top', 'crafting_table_front', 'crafting_table_side',
      // 新增纹理
      'sand', 'sandstone_top', 'sandstone_bottom', 'sandstone_side',
      'glass', 'iron_ore', 'gold_ore', 'diamond_ore',
      'water', 'obsidian', 'redstone_wire', 'redstone_torch',
      'cobblestone', 'gravel', 'clay', 'brick', 'snow',
      // 树木相关纹理
      'leaves', 'birch_log_top', 'birch_log_side', 'spruce_log_top', 'spruce_log_side',
      'birch_leaves', 'spruce_leaves', 'wet_leaves', 'sapling',
      // 物品纹理
      'coal_item', 'ender_pearl', 'iron_ingot', 'gold_ingot', 'diamond', 'raw_iron', 'raw_gold'
    ];

    console.log(`Creating ${textureNames.length} textures...`);
    this.createSimpleTextures(textureNames);
    console.log(`Created ${this.textures.size} textures successfully`);
    
    // 确保所有纹理都已创建完成
    return Promise.resolve();
  }

  private createSimpleTextures(textureNames: string[]): void {
    const colorMap: Record<string, string> = {
      'grass_top': '#7CB342',
      'grass_side': '#8BC34A',
      'dirt': '#8D6E63',
      'stone': '#757575',
      'log_top': '#5D4037',
      'log_side': '#6D4C41',
      'planks': '#8D6E63',
      'coal_ore': '#424242',
      'lava': '#FF5722',
      'furnace_top': '#757575',
      'furnace_front': '#FF9800',
      'furnace_side': '#757575',
      'torch': '#FFC107',
      'crafting_table_top': '#795548',
      'crafting_table_front': '#8D6E63',
      'crafting_table_side': '#795548',
      // 新增方块颜色
      'sand': '#F4E4BC',
      'sandstone_top': '#F5DEB3',
      'sandstone_bottom': '#DEB887',
      'sandstone_side': '#D2B48C',
      'glass': '#E3F2FD',
      'iron_ore': '#8D6E63',
      'gold_ore': '#8D6E63',
      'diamond_ore': '#8D6E63',
      'water': '#2196F3',
      'obsidian': '#1A1A1A',
      'redstone_wire': '#DC143C',
      'redstone_torch': '#FF4500',
      'cobblestone': '#808080',
      'gravel': '#A0A0A0',
      'clay': '#A0522D',
      'brick': '#B22222',
      'snow': '#FFFFFF'
    };

    textureNames.forEach(name => {
      // 为每个纹理创建独立的canvas
      const canvas = document.createElement('canvas');
      canvas.width = 16;
      canvas.height = 16;
      const ctx = canvas.getContext('2d')!;
      
      // 设置基础颜色
      ctx.fillStyle = colorMap[name] || '#FFFFFF';
      ctx.fillRect(0, 0, 16, 16);
      
      // 添加特殊纹理细节
      this.addTextureDetails(ctx, name);

      const texture = new THREE.CanvasTexture(canvas);
      texture.magFilter = THREE.NearestFilter;
      texture.minFilter = THREE.NearestFilter;
      texture.wrapS = THREE.RepeatWrapping;
      texture.wrapT = THREE.RepeatWrapping;
      texture.needsUpdate = true; // 确保纹理更新
      
      this.textures.set(name, texture);
    });
  }

  private addTextureDetails(ctx: CanvasRenderingContext2D, textureName: string): void {
    switch (textureName) {
      case 'grass_top':
        // 添加草的纹理细节
        ctx.fillStyle = '#689F38';
        ctx.fillRect(2, 2, 2, 2);
        ctx.fillRect(6, 1, 1, 1);
        ctx.fillRect(10, 3, 2, 1);
        ctx.fillRect(13, 6, 1, 2);
        ctx.fillRect(4, 8, 3, 1);
        ctx.fillRect(9, 10, 2, 2);
        ctx.fillRect(1, 12, 2, 1);
        ctx.fillRect(14, 13, 1, 1);
        break;
        
      case 'grass_side':
        // 草方块侧面：上部分草色，下部分土色
        ctx.fillStyle = '#8D6E63'; // 土色
        ctx.fillRect(0, 8, 16, 8);
        ctx.fillStyle = '#8BC34A'; // 草色
        ctx.fillRect(0, 0, 16, 8);
        // 添加草土分界线
        ctx.fillStyle = '#689F38';
        ctx.fillRect(0, 7, 16, 2);
        break;
        
      case 'dirt':
        // 添加泥土纹理细节
        ctx.fillStyle = '#6D4C41';
        ctx.fillRect(1, 1, 2, 2);
        ctx.fillRect(5, 3, 3, 2);
        ctx.fillRect(10, 1, 2, 3);
        ctx.fillRect(2, 6, 2, 2);
        ctx.fillRect(8, 8, 3, 2);
        ctx.fillRect(12, 10, 2, 2);
        ctx.fillRect(3, 12, 4, 2);
        break;
        
      case 'stone':
        // 添加石头纹理细节
        ctx.fillStyle = '#616161';
        ctx.fillRect(1, 2, 3, 2);
        ctx.fillRect(6, 1, 2, 3);
        ctx.fillRect(11, 3, 3, 2);
        ctx.fillStyle = '#9E9E9E';
        ctx.fillRect(2, 7, 2, 2);
        ctx.fillRect(8, 6, 3, 3);
        ctx.fillRect(13, 8, 2, 3);
        ctx.fillRect(4, 11, 3, 2);
        break;
        
      case 'log_top':
        // 原木顶部：年轮纹理
        ctx.fillStyle = '#4A2C2A';
        ctx.fillRect(6, 6, 4, 4);
        ctx.fillStyle = '#3E2723';
        ctx.fillRect(7, 7, 2, 2);
        // 外圈年轮
        ctx.strokeStyle = '#4A2C2A';
        ctx.lineWidth = 1;
        ctx.beginPath();
        ctx.arc(8, 8, 5, 0, 2 * Math.PI);
        ctx.stroke();
        break;
        
      case 'log_side':
        // 原木侧面：垂直纹理
        ctx.fillStyle = '#5D4037';
        for (let i = 0; i < 16; i += 4) {
          ctx.fillRect(i, 0, 1, 16);
          ctx.fillRect(i + 2, 0, 1, 16);
        }
        ctx.fillStyle = '#4A2C2A';
        for (let i = 1; i < 16; i += 4) {
          ctx.fillRect(i, 0, 1, 16);
        }
        break;
        
      case 'coal_ore':
        // 煤矿：石头底色加黑色煤块
        ctx.fillStyle = '#757575';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#212121';
        ctx.fillRect(2, 2, 3, 3);
        ctx.fillRect(8, 5, 2, 2);
        ctx.fillRect(12, 9, 3, 3);
        ctx.fillRect(5, 11, 2, 2);
        ctx.fillRect(1, 8, 2, 2);
        break;
        
      case 'planks':
        // 木板：水平纹理
        ctx.fillStyle = '#795548';
        for (let i = 0; i < 16; i += 2) {
          ctx.fillRect(0, i, 16, 1);
        }
        ctx.fillStyle = '#6D4C41';
        for (let i = 1; i < 16; i += 4) {
          ctx.fillRect(0, i, 16, 1);
        }
        break;
        
      case 'crafting_table_top':
        // 工作台顶部：工具图案
        ctx.fillStyle = '#6D4C41';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#3E2723';
        // 画锤子
        ctx.fillRect(3, 3, 6, 2);
        ctx.fillRect(5, 5, 2, 6);
        // 画锯子
        ctx.fillRect(10, 2, 4, 1);
        ctx.fillRect(11, 3, 2, 1);
        ctx.fillRect(12, 4, 2, 6);
        break;
        
      case 'crafting_table_front':
        // 工作台前面：抽屉图案
        ctx.fillStyle = '#6D4C41';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#3E2723';
        ctx.fillRect(2, 4, 12, 8);
        ctx.fillStyle = '#5D4037';
        ctx.fillRect(7, 7, 2, 2);
        break;
        
      case 'furnace_front':
        // 熔炉前面：炉门
        ctx.fillStyle = '#757575';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#212121';
        ctx.fillRect(3, 4, 10, 8);
        ctx.fillStyle = '#FF5722';
        ctx.fillRect(5, 6, 6, 4);
        break;
        
      case 'lava':
        // 岩浆：动态效果（简化版）
        ctx.fillStyle = '#D84315';
        ctx.fillRect(2, 1, 3, 4);
        ctx.fillRect(7, 3, 4, 3);
        ctx.fillRect(12, 2, 2, 5);
        ctx.fillRect(1, 8, 5, 3);
        ctx.fillRect(9, 9, 4, 4);
        ctx.fillStyle = '#FFB74D';
        ctx.fillRect(3, 2, 1, 2);
        ctx.fillRect(8, 4, 2, 1);
        ctx.fillRect(13, 3, 1, 2);
        ctx.fillRect(3, 9, 2, 1);
        ctx.fillRect(11, 11, 1, 1);
        break;
        
      case 'torch':
        // 火把：棕色手柄+黄色火焰
        ctx.fillStyle = '#000000';
        ctx.fillRect(0, 0, 16, 16); // 透明背景用黑色代替
        ctx.fillStyle = '#6D4C41';
        ctx.fillRect(7, 8, 2, 8);
        ctx.fillStyle = '#FFC107';
        ctx.fillRect(6, 2, 4, 6);
        ctx.fillStyle = '#FF8F00';
        ctx.fillRect(7, 3, 2, 4);
        break;
        
      // 新增方块纹理细节
      case 'sand':
        // 沙子：颗粒纹理
        ctx.fillStyle = '#F0D68C';
        ctx.fillRect(1, 1, 1, 1);
        ctx.fillRect(4, 2, 1, 1);
        ctx.fillRect(7, 1, 1, 1);
        ctx.fillRect(10, 3, 1, 1);
        ctx.fillRect(13, 2, 1, 1);
        ctx.fillRect(2, 5, 1, 1);
        ctx.fillRect(6, 6, 1, 1);
        ctx.fillRect(9, 5, 1, 1);
        ctx.fillRect(12, 7, 1, 1);
        ctx.fillRect(3, 9, 1, 1);
        ctx.fillRect(8, 10, 1, 1);
        ctx.fillRect(11, 9, 1, 1);
        ctx.fillRect(1, 12, 1, 1);
        ctx.fillRect(5, 13, 1, 1);
        ctx.fillRect(14, 14, 1, 1);
        break;
        
      case 'leaves':
        // 树叶：绿色叶子纹理
        ctx.fillStyle = '#4CAF50';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#388E3C';
        // 添加叶子细节
        ctx.fillRect(1, 1, 2, 2);
        ctx.fillRect(4, 2, 3, 2);
        ctx.fillRect(8, 1, 2, 3);
        ctx.fillRect(12, 3, 3, 2);
        ctx.fillRect(2, 6, 2, 2);
        ctx.fillRect(6, 5, 3, 3);
        ctx.fillRect(10, 7, 2, 2);
        ctx.fillRect(13, 6, 2, 3);
        ctx.fillRect(1, 10, 3, 2);
        ctx.fillRect(5, 11, 2, 2);
        ctx.fillRect(8, 10, 3, 3);
        ctx.fillRect(12, 11, 3, 2);
        ctx.fillRect(2, 14, 4, 2);
        ctx.fillRect(7, 14, 3, 2);
        ctx.fillRect(11, 13, 4, 3);
        break;
        
      case 'birch_log_top':
        // 白桦原木顶部：浅色年轮
        ctx.fillStyle = '#F5F5DC';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#DDD';
        ctx.fillRect(6, 6, 4, 4);
        ctx.fillStyle = '#CCC';
        ctx.fillRect(7, 7, 2, 2);
        // 外圈年轮
        ctx.strokeStyle = '#DDD';
        ctx.lineWidth = 1;
        ctx.beginPath();
        ctx.arc(8, 8, 5, 0, 2 * Math.PI);
        ctx.stroke();
        break;
        
      case 'birch_log_side':
        // 白桦原木侧面：白色树皮纹理
        ctx.fillStyle = '#F5F5DC';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#E0E0E0';
        // 垂直纹理
        for (let i = 0; i < 16; i += 3) {
          ctx.fillRect(i, 0, 1, 16);
        }
        // 添加白桦特有的黑色斑点
        ctx.fillStyle = '#333';
        ctx.fillRect(2, 3, 1, 2);
        ctx.fillRect(5, 7, 2, 1);
        ctx.fillRect(9, 2, 1, 3);
        ctx.fillRect(12, 9, 1, 2);
        ctx.fillRect(3, 12, 2, 1);
        break;
        
      case 'spruce_log_top':
        // 云杉原木顶部：深色年轮
        ctx.fillStyle = '#8D6E63';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#5D4037';
        ctx.fillRect(6, 6, 4, 4);
        ctx.fillStyle = '#3E2723';
        ctx.fillRect(7, 7, 2, 2);
        // 外圈年轮
        ctx.strokeStyle = '#5D4037';
        ctx.lineWidth = 1;
        ctx.beginPath();
        ctx.arc(8, 8, 5, 0, 2 * Math.PI);
        ctx.stroke();
        break;
        
      case 'spruce_log_side':
        // 云杉原木侧面：深色树皮
        ctx.fillStyle = '#8D6E63';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#6D4C41';
        for (let i = 0; i < 16; i += 4) {
          ctx.fillRect(i, 0, 1, 16);
          ctx.fillRect(i + 2, 0, 1, 16);
        }
        ctx.fillStyle = '#5D4037';
        for (let i = 1; i < 16; i += 4) {
          ctx.fillRect(i, 0, 1, 16);
        }
        break;
        
      case 'birch_leaves':
        // 白桦树叶：浅绿色
        ctx.fillStyle = '#8BC34A';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#689F38';
        // 添加叶子细节
        ctx.fillRect(1, 2, 2, 2);
        ctx.fillRect(5, 1, 3, 2);
        ctx.fillRect(9, 3, 2, 2);
        ctx.fillRect(12, 1, 2, 3);
        ctx.fillRect(2, 6, 3, 2);
        ctx.fillRect(7, 5, 2, 3);
        ctx.fillRect(11, 7, 3, 2);
        ctx.fillRect(1, 10, 2, 3);
        ctx.fillRect(5, 11, 3, 2);
        ctx.fillRect(9, 10, 2, 3);
        ctx.fillRect(13, 12, 2, 2);
        ctx.fillRect(3, 14, 4, 2);
        ctx.fillRect(8, 14, 3, 2);
        break;
        
      case 'spruce_leaves':
        // 云杉树叶：深绿色
        ctx.fillStyle = '#2E7D32';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#1B5E20';
        // 添加针叶细节
        ctx.fillRect(1, 1, 1, 3);
        ctx.fillRect(3, 2, 1, 2);
        ctx.fillRect(5, 1, 1, 4);
        ctx.fillRect(7, 3, 1, 2);
        ctx.fillRect(9, 1, 1, 3);
        ctx.fillRect(11, 2, 1, 3);
        ctx.fillRect(13, 1, 1, 2);
        ctx.fillRect(2, 6, 1, 3);
        ctx.fillRect(4, 7, 1, 2);
        ctx.fillRect(6, 6, 1, 4);
        ctx.fillRect(8, 8, 1, 2);
        ctx.fillRect(10, 6, 1, 3);
        ctx.fillRect(12, 7, 1, 3);
        ctx.fillRect(14, 6, 1, 2);
        ctx.fillRect(1, 11, 1, 3);
        ctx.fillRect(3, 12, 1, 2);
        ctx.fillRect(5, 11, 1, 4);
        ctx.fillRect(7, 13, 1, 2);
        ctx.fillRect(9, 11, 1, 3);
        ctx.fillRect(11, 12, 1, 3);
        ctx.fillRect(13, 11, 1, 2);
        break;
        
      case 'wet_leaves':
        // 含水树叶：深绿色带水滴
        ctx.fillStyle = '#2E7D32';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#1B5E20';
        // 叶子纹理
        ctx.fillRect(1, 1, 2, 2);
        ctx.fillRect(4, 2, 3, 2);
        ctx.fillRect(8, 1, 2, 3);
        ctx.fillRect(12, 3, 3, 2);
        // 水滴效果
        ctx.fillStyle = '#81D4FA';
        ctx.fillRect(3, 5, 1, 1);
        ctx.fillRect(7, 8, 1, 1);
        ctx.fillRect(11, 6, 1, 1);
        ctx.fillRect(5, 12, 1, 1);
        ctx.fillRect(13, 10, 1, 1);
        break;
        
      case 'sapling':
        // 树苗：小树苗图案
        ctx.fillStyle = '#000000';
        ctx.fillRect(0, 0, 16, 16); // 透明背景
        ctx.fillStyle = '#8BC34A';
        // 树苗主体
        ctx.fillRect(7, 4, 2, 8);
        ctx.fillStyle = '#4CAF50';
        // 叶子
        ctx.fillRect(5, 4, 6, 2);
        ctx.fillRect(6, 6, 4, 2);
        ctx.fillStyle = '#6D4C41';
        // 树干
        ctx.fillRect(7, 10, 2, 4);
        break;
        
      // 物品纹理
      case 'coal_item':
        // 煤炭物品
        ctx.fillStyle = '#000000';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#212121';
        ctx.fillRect(2, 2, 12, 12);
        ctx.fillStyle = '#424242';
        ctx.fillRect(4, 4, 8, 8);
        break;
        
      case 'ender_pearl':
        // 末影珍珠
        ctx.fillStyle = '#1A237E';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#3F51B5';
        ctx.fillRect(2, 2, 12, 12);
        ctx.fillStyle = '#7986CB';
        ctx.fillRect(4, 4, 8, 8);
        ctx.fillStyle = '#C5CAE9';
        ctx.fillRect(6, 6, 4, 4);
        break;
        
      case 'iron_ingot':
        // 铁锭
        ctx.fillStyle = '#90A4AE';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#B0BEC5';
        ctx.fillRect(2, 4, 12, 8);
        ctx.fillStyle = '#CFD8DC';
        ctx.fillRect(4, 6, 8, 4);
        break;
        
      case 'gold_ingot':
        // 金锭
        ctx.fillStyle = '#FF8F00';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#FFC107';
        ctx.fillRect(2, 4, 12, 8);
        ctx.fillStyle = '#FFEB3B';
        ctx.fillRect(4, 6, 8, 4);
        break;
        
      case 'diamond':
        // 钻石
        ctx.fillStyle = '#00BCD4';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#26C6DA';
        ctx.fillRect(4, 2, 8, 12);
        ctx.fillStyle = '#4DD0E1';
        ctx.fillRect(6, 4, 4, 8);
        ctx.fillStyle = '#80DEEA';
        ctx.fillRect(7, 6, 2, 4);
        break;
        
      case 'raw_iron':
        // 粗铁
        ctx.fillStyle = '#8D6E63';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#A1887F';
        ctx.fillRect(2, 2, 12, 12);
        ctx.fillStyle = '#BCAAA4';
        ctx.fillRect(4, 4, 8, 8);
        break;
        
      case 'raw_gold':
        // 粗金
        ctx.fillStyle = '#FF8F00';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#FFB300';
        ctx.fillRect(2, 2, 12, 12);
        ctx.fillStyle = '#FFC107';
        ctx.fillRect(4, 4, 8, 8);
        break;
        
      case 'sandstone_top':
        // 砂岩顶部：平滑纹理
        ctx.fillStyle = '#E6D3A3';
        ctx.fillRect(2, 2, 12, 1);
        ctx.fillRect(1, 6, 14, 1);
        ctx.fillRect(3, 10, 10, 1);
        ctx.fillRect(2, 14, 12, 1);
        break;
        
      case 'sandstone_side':
        // 砂岩侧面：层状纹理
        ctx.fillStyle = '#C8B99C';
        for (let i = 0; i < 16; i += 3) {
          ctx.fillRect(0, i, 16, 1);
        }
        ctx.fillStyle = '#E6D3A3';
        ctx.fillRect(0, 1, 16, 1);
        ctx.fillRect(0, 4, 16, 1);
        ctx.fillRect(0, 7, 16, 1);
        ctx.fillRect(0, 10, 16, 1);
        ctx.fillRect(0, 13, 16, 1);
        break;
        
      case 'glass':
        // 玻璃：透明效果
        ctx.fillStyle = '#B3E5FC';
        ctx.fillRect(0, 0, 1, 16);
        ctx.fillRect(15, 0, 1, 16);
        ctx.fillRect(0, 0, 16, 1);
        ctx.fillRect(0, 15, 16, 1);
        ctx.fillStyle = '#81D4FA';
        ctx.fillRect(3, 3, 1, 1);
        ctx.fillRect(8, 5, 1, 1);
        ctx.fillRect(12, 8, 1, 1);
        ctx.fillRect(5, 11, 1, 1);
        break;
        
      case 'iron_ore':
        // 铁矿：石头底色加铁色斑点
        ctx.fillStyle = '#757575';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#8D6E63';
        ctx.fillRect(2, 3, 3, 2);
        ctx.fillRect(7, 1, 2, 3);
        ctx.fillRect(11, 5, 3, 2);
        ctx.fillRect(1, 8, 2, 2);
        ctx.fillRect(6, 10, 3, 2);
        ctx.fillRect(12, 12, 2, 2);
        break;
        
      case 'gold_ore':
        // 金矿：石头底色加金色斑点
        ctx.fillStyle = '#757575';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#FFD700';
        ctx.fillRect(3, 2, 2, 2);
        ctx.fillRect(8, 4, 3, 2);
        ctx.fillRect(12, 1, 2, 3);
        ctx.fillRect(1, 7, 3, 2);
        ctx.fillRect(7, 9, 2, 2);
        ctx.fillRect(13, 11, 2, 3);
        break;
        
      case 'diamond_ore':
        // 钻石矿：石头底色加蓝色斑点
        ctx.fillStyle = '#757575';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#00BCD4';
        ctx.fillRect(2, 2, 2, 2);
        ctx.fillRect(7, 3, 3, 2);
        ctx.fillRect(12, 5, 2, 2);
        ctx.fillRect(1, 9, 2, 2);
        ctx.fillRect(6, 11, 3, 2);
        ctx.fillRect(11, 13, 3, 2);
        break;
        
      case 'water':
        // 水：波纹效果
        ctx.fillStyle = '#1976D2';
        for (let i = 0; i < 16; i += 2) {
          ctx.fillRect(0, i, 16, 1);
        }
        ctx.fillStyle = '#42A5F5';
        ctx.fillRect(2, 1, 4, 1);
        ctx.fillRect(8, 3, 6, 1);
        ctx.fillRect(1, 5, 5, 1);
        ctx.fillRect(9, 7, 4, 1);
        ctx.fillRect(3, 9, 7, 1);
        ctx.fillRect(1, 11, 3, 1);
        ctx.fillRect(10, 13, 5, 1);
        break;
        
      case 'obsidian':
        // 黑曜石：深色光泽
        ctx.fillStyle = '#0D0D0D';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#2D2D2D';
        ctx.fillRect(2, 1, 3, 2);
        ctx.fillRect(7, 3, 4, 2);
        ctx.fillRect(12, 1, 2, 3);
        ctx.fillRect(1, 6, 2, 3);
        ctx.fillRect(5, 8, 3, 2);
        ctx.fillRect(10, 7, 4, 3);
        ctx.fillRect(3, 12, 5, 2);
        ctx.fillRect(11, 13, 3, 2);
        break;
        
      case 'redstone_wire':
        // 红石线：红色线条
        ctx.fillStyle = '#000000';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#DC143C';
        ctx.fillRect(7, 0, 2, 16);
        ctx.fillRect(0, 7, 16, 2);
        ctx.fillStyle = '#FF6B6B';
        ctx.fillRect(7, 7, 2, 2);
        break;
        
      case 'redstone_torch':
        // 红石火把：红色火焰
        ctx.fillStyle = '#000000';
        ctx.fillRect(0, 0, 16, 16);
        ctx.fillStyle = '#6D4C41';
        ctx.fillRect(7, 8, 2, 8);
        ctx.fillStyle = '#DC143C';
        ctx.fillRect(6, 2, 4, 6);
        ctx.fillStyle = '#FF4500';
        ctx.fillRect(7, 3, 2, 4);
        break;
        
      case 'cobblestone':
        // 圆石：不规则石块
        ctx.fillStyle = '#696969';
        ctx.fillRect(1, 1, 3, 3);
        ctx.fillRect(5, 2, 2, 2);
        ctx.fillRect(8, 1, 4, 3);
        ctx.fillRect(13, 2, 2, 3);
        ctx.fillRect(1, 5, 2, 3);
        ctx.fillRect(4, 6, 3, 2);
        ctx.fillRect(8, 5, 3, 4);
        ctx.fillRect(12, 6, 3, 2);
        ctx.fillRect(2, 10, 4, 3);
        ctx.fillRect(7, 10, 2, 3);
        ctx.fillRect(10, 9, 4, 4);
        ctx.fillRect(1, 14, 6, 2);
        ctx.fillRect(8, 14, 7, 2);
        break;
        
      case 'gravel':
        // 沙砾：灰色颗粒
        ctx.fillStyle = '#909090';
        ctx.fillRect(1, 2, 2, 2);
        ctx.fillRect(4, 1, 3, 2);
        ctx.fillRect(8, 3, 2, 2);
        ctx.fillRect(11, 1, 3, 3);
        ctx.fillRect(2, 6, 3, 2);
        ctx.fillRect(6, 5, 2, 3);
        ctx.fillRect(9, 7, 4, 2);
        ctx.fillRect(1, 10, 2, 3);
        ctx.fillRect(4, 11, 3, 2);
        ctx.fillRect(8, 10, 3, 3);
        ctx.fillRect(12, 11, 3, 2);
        ctx.fillRect(2, 14, 5, 2);
        ctx.fillRect(8, 14, 6, 2);
        break;
        
      case 'clay':
        // 粘土：光滑纹理
        ctx.fillStyle = '#8B7355';
        ctx.fillRect(2, 2, 12, 12);
        ctx.fillStyle = '#A0522D';
        ctx.fillRect(1, 1, 14, 1);
        ctx.fillRect(1, 14, 14, 1);
        ctx.fillRect(1, 1, 1, 14);
        ctx.fillRect(14, 1, 1, 14);
        break;
        
      case 'brick':
        // 砖块：砖块图案
        ctx.fillStyle = '#8B4513';
        // 第一行砖块
        ctx.fillRect(0, 0, 7, 3);
        ctx.fillRect(8, 0, 8, 3);
        // 第二行砖块
        ctx.fillRect(0, 4, 3, 3);
        ctx.fillRect(4, 4, 8, 3);
        ctx.fillRect(13, 4, 3, 3);
        // 第三行砖块
        ctx.fillRect(0, 8, 7, 3);
        ctx.fillRect(8, 8, 8, 3);
        // 第四行砖块
        ctx.fillRect(0, 12, 3, 4);
        ctx.fillRect(4, 12, 8, 4);
        ctx.fillRect(13, 12, 3, 4);
        // 砖块间隙
        ctx.fillStyle = '#654321';
        ctx.fillRect(7, 0, 1, 3);
        ctx.fillRect(3, 4, 1, 3);
        ctx.fillRect(12, 4, 1, 3);
        ctx.fillRect(7, 8, 1, 3);
        ctx.fillRect(3, 12, 1, 4);
        ctx.fillRect(12, 12, 1, 4);
        ctx.fillRect(0, 3, 16, 1);
        ctx.fillRect(0, 7, 16, 1);
        ctx.fillRect(0, 11, 16, 1);
        break;
        
      case 'snow':
        // 雪：白色纹理
        ctx.fillStyle = '#F0F8FF';
        ctx.fillRect(1, 1, 2, 2);
        ctx.fillRect(5, 2, 3, 2);
        ctx.fillRect(10, 1, 2, 2);
        ctx.fillRect(13, 3, 2, 2);
        ctx.fillRect(2, 6, 2, 2);
        ctx.fillRect(6, 5, 2, 3);
        ctx.fillRect(9, 7, 3, 2);
        ctx.fillRect(13, 6, 2, 3);
        ctx.fillRect(1, 10, 3, 2);
        ctx.fillRect(5, 11, 2, 2);
        ctx.fillRect(8, 10, 3, 3);
        ctx.fillRect(12, 11, 3, 2);
        ctx.fillRect(2, 14, 4, 2);
        ctx.fillRect(7, 14, 3, 2);
        ctx.fillRect(11, 13, 4, 3);
        break;
    }
  }

  public getTexture(name: string): THREE.Texture | undefined {
    return this.textures.get(name);
  }

  public createBlockMaterial(textureName: string): THREE.MeshLambertMaterial {
    const texture = this.getTexture(textureName);
    if (!texture) {
      console.warn(`Texture not found: ${textureName}, using default color`);
      // 创建一个默认的彩色材质，便于调试
      const colors = {
        'grass_top': 0x7CB342,
        'grass_side': 0x8BC34A,
        'dirt': 0x8D6E63,
        'stone': 0x757575,
        'log_top': 0x5D4037,
        'log_side': 0x6D4C41,
        'planks': 0x8D6E63,
        'leaves': 0x4CAF50
      };
      
      return new THREE.MeshLambertMaterial({
        color: colors[textureName as keyof typeof colors] || 0xffffff,
        transparent: false
      });
    }
    
    return new THREE.MeshLambertMaterial({
      map: texture,
      transparent: false
    });
  }

  public createBlockMaterials(textureNames: {
    top?: string;
    bottom?: string;
    sides?: string;
    front?: string;
    back?: string;
    left?: string;
    right?: string;
  }): THREE.MeshLambertMaterial[] {
    const materials: THREE.MeshLambertMaterial[] = [];
    
    // 确保所有纹理都存在，如果不存在则使用默认纹理
    const defaultTexture = 'stone';
    
    // Three.js 方块面的顺序：右、左、上、下、前、后
    materials.push(this.createBlockMaterial(textureNames.right || textureNames.sides || defaultTexture));
    materials.push(this.createBlockMaterial(textureNames.left || textureNames.sides || defaultTexture));
    materials.push(this.createBlockMaterial(textureNames.top || textureNames.sides || defaultTexture));
    materials.push(this.createBlockMaterial(textureNames.bottom || textureNames.sides || defaultTexture));
    materials.push(this.createBlockMaterial(textureNames.front || textureNames.sides || defaultTexture));
    materials.push(this.createBlockMaterial(textureNames.back || textureNames.sides || defaultTexture));
    
    return materials;
  }

  public createTransparentBlockMaterials(textureNames: {
    top?: string;
    bottom?: string;
    sides?: string;
    front?: string;
    back?: string;
    left?: string;
    right?: string;
  }): THREE.MeshLambertMaterial[] {
    const materials: THREE.MeshLambertMaterial[] = [];
    
    materials.push(this.createTransparentBlockMaterial(textureNames.right || textureNames.sides || 'glass'));
    materials.push(this.createTransparentBlockMaterial(textureNames.left || textureNames.sides || 'glass'));
    materials.push(this.createTransparentBlockMaterial(textureNames.top || textureNames.sides || 'glass'));
    materials.push(this.createTransparentBlockMaterial(textureNames.bottom || textureNames.sides || 'glass'));
    materials.push(this.createTransparentBlockMaterial(textureNames.front || textureNames.sides || 'glass'));
    materials.push(this.createTransparentBlockMaterial(textureNames.back || textureNames.sides || 'glass'));
    
    return materials;
  }

  public createTransparentBlockMaterial(textureName: string): THREE.MeshLambertMaterial {
    const texture = this.getTexture(textureName);
    return new THREE.MeshLambertMaterial({
      map: texture,
      transparent: true,
      opacity: 0.8,
      alphaTest: 0.1,
      side: THREE.DoubleSide // 双面渲染，确保透明方块内部可见
    });
  }
}